package com.ssyc.common.manager;

import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.ssyc.common.base.BaseApplication;
import com.ssyc.common.base.ScrollSpeedLinearLayoutManger;
import com.ssyc.common.bqahelper.CustomLoadMoreView;
import com.ssyc.common.utils.UiUtils;

import java.util.List;

/**
 * 创建日期：2017/8/12  12:34
 * 描述:用来管理BaseQuickAdapter和RecyclerView的封装类
 * 作者:张伟
 */

public class BqaManager {

    //正常加载
    public static final int NORML = 0X110;
    //下拉刷新
    public static final int PULLREFRESH = 0X120;
    //加载更多
    public static final int LOADINDGMORE = 0X130;


    /*-----------------------同时使用SmartRefreshLayout的下拉刷新和加载更多------------------------------------------*/

    /**
     * 设置RecyclerView的方法(不使用Adapter的加载更多功能)
     *
     * @param EmptyView 没有数据时显示的空视图
     * @param context   上下文对象
     * @param adapter   继承BaseQuickAdapter的自定义适配器
     * @param rv        RecyclerView控件
     */
    public static void setRv(View EmptyView, Context context, BaseQuickAdapter adapter, RecyclerView rv) {
        //设置空的视图
        if (EmptyView != null) {
            adapter.setEmptyView(EmptyView);
        }
        //设置布局管理器
        LinearLayoutManager manager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false);
        if (rv != null) {
            rv.setLayoutManager(manager);
            rv.setAdapter(adapter);
        }

        //同时配置头布局和空视图同时显示
        adapter.setHeaderAndEmpty(true);

        //关闭加载更多的功能
        adapter.setEnableLoadMore(false);

        //开启动画(默认为渐变效果)
        adapter.openLoadAnimation();
    }


    /**
     * 设置RecyclerView的方法(不使用Adapter的加载更多功能)
     *
     * @param EmptyView 没有数据时显示的空视图
     * @param context   上下文对象
     * @param adapter   继承BaseQuickAdapter的自定义适配器
     * @param rv        RecyclerView控件
     *                  与上面的方法相比,该方法可以实现Recycler的平滑滚动
     */
    public static void setRvByScroller(View EmptyView, Context context, BaseQuickAdapter adapter, RecyclerView rv) {
        //设置空的视图
        if (EmptyView != null) {
            adapter.setEmptyView(EmptyView);
        }
        //设置布局管理器
        ScrollSpeedLinearLayoutManger manager = new ScrollSpeedLinearLayoutManger(context, LinearLayoutManager.VERTICAL, false);

        if (rv != null) {
            rv.setLayoutManager(manager);
            rv.setAdapter(adapter);
        }

        //同时配置头布局和空视图同时显示
        adapter.setHeaderAndEmpty(true);

        //关闭加载更多的功能
        adapter.setEnableLoadMore(false);

        //开启动画(默认为渐变效果)
        adapter.openLoadAnimation();
    }


    /**
     * SmartRefreshLayout(同时使用SmartRefreshLayout的下拉刷新和加载更多后的数据更新方法)
     * 下拉刷新和加载更多后的数据更新的方法
     *
     * @param method   刷新方法
     * @param srf      下拉刷新控件
     * @param rv       RecyclerView控件
     * @param oldDatas 原始集合数据源
     * @param newDatas 请求到的新的集合数据源
     * @param adapter  BaseQuickAdapte适配器
     * @param <T>      数据的泛型
     */
    public static <T> void updateRv(int method, SmartRefreshLayout srf, RecyclerView rv, List<T> oldDatas, List<T> newDatas, BaseQuickAdapter adapter) {
        if (newDatas == null) {
            //返回没有数据的情况
            if (method == PULLREFRESH) {
                //下拉刷新的时候没有数据的情况,关闭SmartRefreshLayout的下拉刷新
                if (srf != null) {
                    srf.finishRefresh();
//                    srf.resetNoMoreData();//恢复没有更多数据的原始状态
                }
            } else if (method == LOADINDGMORE) {
                //加载更多时没有数据的情况,停止加载更多
                srf.finishLoadmoreWithNoMoreData();
                srf.resetNoMoreData();//恢复没有更多数据的原始状态
            }

        } else {
            //返回有数据的情况
            //证明有数据
            //第一种情况:数据集合不为空,但是长度为0,这种情况我们认为是数据加载完成
            if (newDatas.size() == 0) {
                if (method == PULLREFRESH) {
                    //下拉刷新的时候没有数据的情况,停止下拉刷新
                    if (srf != null) {
                        srf.finishRefresh();
//                        srf.resetNoMoreData();//恢复没有更多数据的原始状态
                    }
                } else if (method == LOADINDGMORE) {
                    //加载更多时没有数据的情况,停止加载更多
                    srf.finishLoadmoreWithNoMoreData();
                    srf.resetNoMoreData();//恢复没有更多数据的原始状态
                }
            } else {
                //第二种情况:证明数据长度不为0
                //如果是下拉刷新,则先将原数据源的数据进行清空处理,然后在将新数据添加到数据源中,加载更多直接添加新数据即可
                if (method == PULLREFRESH) {
                    //下拉刷新
                    oldDatas.clear();
                    oldDatas.addAll(newDatas);
                    //这里如果使用BaseRecyclerViewAdapterHelper必须重新设置setNewData,否则会出现数据加载完成后再次下拉刷新不能再次自动加载更多的情况
                    adapter.setNewData(oldDatas);

                } else {
                    //加载更多
                    adapter.addData(newDatas);
                    adapter.notifyDataSetChanged();
                }
                //如果是加载更多,设置加载完成
                if (method == PULLREFRESH) {
                    if (srf != null) {
                        srf.finishRefresh();
                        srf.resetNoMoreData();//恢复没有更多数据的原始状态
                    }
                }
                //如果是下拉刷新,设置下拉完成
                if (method == LOADINDGMORE) {
                    srf.finishLoadmore();
                }
            }
        }
    }

    /**
     * 当网络请求错误时对列表界面进行处理的方法
     * 适用SmartRefresLayout(使用其下拉刷新和加载更多)
     *
     * @param method
     */
    public static void setErrorNet(int method, SmartRefreshLayout srf, BaseQuickAdapter adapter) {
        if (method == PULLREFRESH || method == NORML) {
            //下拉刷新的时候关闭下拉刷新
            if (srf != null) {
                srf.finishRefresh();
            }
        } else if (method == LOADINDGMORE) {
            //加载更多的时候关闭加载更多
            srf.finishLoadmore();
        }
        UiUtils.Toast("网络错误", false);
    }

    /*-----------------------使用SmartRefreshLayout的下拉刷新和Adapter的加载更多------------------------------------------*/

    /**
     * 设置RecyclerView的方法(使用Adapter的加载更多功能)
     *
     * @param EmptyView 没有数据时显示的空视图
     * @param context   上下文对象
     * @param adapter   继承BaseQuickAdapter的自定义适配器
     * @param rv        RecyclerView控件
     * @param listener  加载更多的回调监听
     */
    public static void setRv(View EmptyView, Context context, BaseQuickAdapter adapter, RecyclerView rv, final OnloadingMoreListener listener) {
        if (EmptyView != null) {
            adapter.setEmptyView(EmptyView);
        }
        //设置布局管理器
//        LinearLayoutManager manager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false);
        ScrollSpeedLinearLayoutManger manager = new ScrollSpeedLinearLayoutManger(context, LinearLayoutManager.VERTICAL, false);
        if (rv != null) {
            rv.setLayoutManager(manager);
            rv.setAdapter(adapter);
        }

        if (null != listener) {

            //开启加载更多的功能
            adapter.setEnableLoadMore(true);

            //设置加载更多
            adapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
                @Override
                public void onLoadMoreRequested() {
                    if (listener != null) {
                        listener.onLoadMore();
                    }
                }
            }, rv);

            //设置适配器的LoadingView
            adapter.setLoadMoreView(new CustomLoadMoreView());

            //数据不满屏不进入回调
            adapter.disableLoadMoreIfNotFullPage();

        } else {
            //关闭加载更多的功能
            adapter.setEnableLoadMore(false);
        }

        //同时配置头布局和空视图同时显示
        adapter.setHeaderAndEmpty(true);

        //开启动画(默认为渐变效果)
        adapter.openLoadAnimation();
    }

    /**
     * SmartRefreshLayout(只使用的第三方的下拉刷新)
     * 下拉刷新和加载更多后的数据处理方法
     */
    public static <T> void updateRvBySmf(int method, SmartRefreshLayout srf, RecyclerView xrv, List<T> oldDatas, List<T> newDatas, BaseQuickAdapter adapter) {
        if (newDatas == null || newDatas.size() == 0) {
            //返回没有数据的情况
            if (method == PULLREFRESH) {
                //下拉刷新的时候没有数据的情况,关闭SwipeRefreshLayout的下拉刷新
                if (srf != null) {
                    srf.finishRefresh();
                }
                oldDatas.clear();
                adapter.notifyDataSetChanged();
            } else if (method == LOADINDGMORE) {
                //加载更多时没有数据的情况,停止加载更多
                adapter.loadMoreEnd();
            }
        } else {
            //第二种情况:证明数据长度不为0
            //如果是下拉刷新,则先将原数据源的数据进行清空处理,然后在将新数据添加到数据源中,加载更多直接添加新数据即可
            if (method == PULLREFRESH) {
                //下拉刷新
                oldDatas.clear();
                oldDatas.addAll(newDatas);
                //这里如果使用BaseRecyclerViewAdapterHelper必须重新设置setNewData,否则会出现数据加载完成后再次下拉刷新不能再次自动加载更多的情况
                adapter.setNewData(oldDatas);

            } else {
                //加载更多
                adapter.addData(newDatas);
            }
            //如果是下拉刷新,设置下拉完成
            if (method == PULLREFRESH) {
                if (srf != null) {
                    srf.finishRefresh();
                }
            }
            //如果是加载更多,设置加载完成
            if (method == LOADINDGMORE) {
                adapter.loadMoreComplete();
            }
        }
    }

    /**
     * 当网络请求错误时对列表界面进行处理的方法
     * 使用SmartRefreshLayout下拉刷新和Adapter的加载更多
     *
     * @param method
     */
    public static void setErrorNet(View rlLoadingView, SmartRefreshLayout spl, int method, BaseQuickAdapter adapter) {

        if (method == NORML) {
            if (rlLoadingView != null && rlLoadingView.getVisibility() == View.VISIBLE) {
                rlLoadingView.setVisibility(View.GONE);
            }
        } else if (method == PULLREFRESH) {
            //下拉刷新的时候关闭下拉刷新
            if (spl != null) {
                spl.finishRefresh(false);
            }
        } else if (method == LOADINDGMORE) {
            //加载更多的时候关闭加载更多
            adapter.loadMoreComplete();
        }
        UiUtils.Toast(BaseApplication.ERROR, false);
    }


    /*---------------------------配置GridLayoutManager的方法--------------------------------------*/

    /**
     * 设置RecyclerView的方法,配置gridLayoutManager
     *
     * @param EmptyView 没有数据时显示的空视图
     * @param context   上下文对象
     * @param adapter   继承BaseQuickAdapter的自定义适配器
     * @param rv        RecyclerView控件
     * @param listener  加载更多的回调监听
     */
    public static void setRv(View EmptyView, GridLayoutManager gridLayoutManager, Context context, BaseQuickAdapter adapter, RecyclerView rv, final OnloadingMoreListener listener) {

        //设置空的视图
        if (EmptyView != null) {
            adapter.setEmptyView(EmptyView);
        }

        //传入了下拉刷新接口则开启加载更多的功能,否则关闭加载更多
        if (null == listener) {
            adapter.setEnableLoadMore(false);
        } else {
            adapter.setEnableLoadMore(true);
        }


        //同时配置头布局和空视图同时显示
        adapter.setHeaderAndEmpty(true);

        //开启动画(默认为渐变效果)
        adapter.openLoadAnimation();

        //设置适配器的LoadingView
        adapter.setLoadMoreView(new CustomLoadMoreView());

        //配置GridLayoutManager的方法
        rv.setLayoutManager(gridLayoutManager);
        rv.setAdapter(adapter);

        //开启动画(默认为渐变效果)
        adapter.openLoadAnimation();
        //只要设置了加载更多的监听就会开启加载更多的功能
        if (null != listener) {
            adapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
                @Override
                public void onLoadMoreRequested() {
                    if (listener != null) {
                        listener.onLoadMore();
                    }
                }
            }, rv);
            //关闭默认第一次的回调, 在设置回调后调用该方法
            adapter.disableLoadMoreIfNotFullPage();
        }
    }
}
